import axios from 'axios'
// import { get_lid } from '@Utils/getPageDecrypt'
// import { store } from "~store"

const service = axios.create({
  baseURL: 'https://fxg.jinritemai.com/',
  timeout: 5 * 1000,
  retry: 1, //设置全局重试请求次数（最多重试几次请求）
  retryDelay: 100, //设置全局请求间隔
})
// http请求拦截
service.interceptors.request.use(config => {
  config.headers['cookie'] = config.ctx.header.t
  config.headers['Content-Type'] = 'application/json'
  config.headers['user-agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
  config.headers['content-type'] = 'text/plain;charset=UTF-8'
  // console.log('config', config)
  try {
    const getUrlOrder = new URL(config.url)
    // console.log('getUrlOrder', getUrlOrder)
    config.headers['origin'] = getUrlOrder.origin
  } catch (error) {
    config.headers['origin'] = 'https://fxg.jinritemai.com'
  }
  const hergers = config.ctx.header
  if (hergers) {
    Object.keys(hergers).forEach(key => {
      const keys = key.split('wt-')
      // console.log('keys', keys)
      if (keys[1]) {
        config.headers[keys[1]] = hergers[key]
      }
      // config.headers[key] = hergers[key]
    })
  }
  // console.log('config.headers', config.headers)
  // console.log('config', config.ctx.header)
  if (config.ctx.request.body && Object.keys(config.ctx.request.body).length) {
    try {
      let reqjson = config.ctx.request.body
      try {
        reqjson = JSON.parse(config.ctx.request.body)

      } catch (error) {
        // console.log('error', error)
      }
      delete reqjson.query.shop_id
      if (!/\?/.test(config.url)) {
        let str = splitJoint(reqjson.query);
        config.url += str;
        if (config.method == 'GET' || config.method == 'get') {
          config.data = undefined
        }
      }
    } catch (error) {
      throw new Error('请求参数错误,需要json')
    }

  } else if (config.ctx.query && Object.keys(config.ctx.query).length) {
    if (!/\?/.test(config.url)) {
      let str = splitJoint(config.ctx.query);
      config.url += str;
      if (config.method == 'GET' || config.method == 'get') {
        config.data = undefined
      }
    }
  }
  return config
}, error => {
  // Do something with request error
  Promise.reject(error)
});
function splitJoint(obj) {
  let arr = [];
  for (let key in obj) {
    arr.push(key + '=' + obj[key]);
  }
  return arr.length > 0 ? '?' + arr.join('&') : '';
}

// response 拦截器
service.interceptors.response.use(response => {
  // response.config.ctx.body = response.data;
  return response.data;

}, error => {
  let config = error.config
  // console.log('error.responsec重试请求', error.response.status)
  if (error.response.status === 403) {
    return Promise.resolve({ status: error.response.status })
  }
  // return
  if (!config || !config.retry) return Promise.reject(error)
  // console.log('error.response', error.response)
  // console.log('error.responsec重试请求', error.statusCode)
  //如果有响应内容，就直接返回错误信息，不再发送请求
  // if (error.response && error.response.data) {
  //   return Promise.reject({ type: "error", msg: error.response.data })
  // }

  config.__retryCount = config.__retryCount || 0

  // 如果当前发送的请求大于等于设置好的请求次数时，不再发送请求，返回最终的错误信息
  if (config.__retryCount >= config.retry) {
    if (error.message === "Network Error") {
      //message为"Network Error"代表断网了
      // message.error('网络连接已断开，请检查网络')
      return Promise.reject({
        type: "warning",
        msg: "网络连接已断开，请检查网络"
      })
    } else if (error.message === "timeout of 40000ms exceeded") {
      //网太慢了，5秒内没有接收到数据，这里的5000ms对应上方timeout设置的值
      // message.error('请求超时，请检查网络')

      return Promise.reject({ type: "warning", msg: "请求超时，请检查网络" })
    } else {
      //除以上两种以外的所有错误，包括接口报错 400 500 之类的
      return Promise.reject({ type: "error", msg: "出现错误，请稍后再试" })
    }
  }

  // 记录请求次数+1
  config.__retryCount += 1

  // 设置请求间隔 在发送下一次请求之前停留一段时间，时间为上方设置好的请求间隔时间
  let backoff = new Promise(function (resolve) {
    setTimeout(function () {
      resolve()
    }, config.retryDelay || 1)
  })

  // 再次发送请求
  return backoff.then(function () {
    return service(config)
  })
  // return Promise.reject(error)
})
export default service;
